package hd.util.file;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Environment;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

import hd.util.StringUtils;
import hd.util.TimeUtil;

/**
 * 文件类工具
 * <p/>
 * Created by Haidy on 14-10-9.
 */
public class FileUtil {

    public static void init(Context context) {
//        makeRootDirectory(getSoftRootPath(context, "HFUTER"));
    }

    /**
     * 复制文件到某个路径
     *
     * @param res  软件内资源
     * @param path 存放路径
     * @throws java.io.IOException
     */
    public static boolean copyFile(Context context, int res, String path, String fileName) throws IOException {
        // 获取软件资源内资源转换为输入流
        InputStream in = context.getResources().openRawResource(res);
        return makeRootDirectory(path) && writeFile(in, new FileOutputStream(path + File.separator + fileName));
    }

    /**
     * 复制文件
     *
     * @param file     file
     * @param path     path
     * @param fileName fileName
     * @throws IOException io异常
     */
    public static boolean copyFile(File file, String path, String fileName) throws IOException {
        return makeRootDirectory(path) && writeFile(new FileInputStream(file), new FileOutputStream(path + File.separator + fileName));
    }

    /**
     * 拷贝文件
     *
     * @param file     文件
     * @param filePath filePath
     */
    public static boolean copyFile(File file, String filePath) throws IOException {
        File copyFile = new File(filePath);
        return makeRootDirectory(copyFile.getParent()) && writeFile(new FileInputStream(file), new FileOutputStream(copyFile));
    }

    /**
     * 写入文件
     *
     * @param inputStream  is
     * @param outputStream os
     * @throws IOException io异常
     */
    private static boolean writeFile(InputStream inputStream, OutputStream outputStream) throws IOException {
        byte[] buffer = new byte[4096];// 每次取出的字节数
        int count;// 字节的长度
        while ((count = inputStream.read(buffer)) >= 0) {
            outputStream.write(buffer, 0, count);
        }
        outputStream.close();
        inputStream.close();
        return true;
    }

    /**
     * 子线程获取listFile
     *
     * @param file     file
     * @param listener 回调接口
     */
    public static void listFile(final File file, final OnFileLoadListener<List<File>> listener) {
        new Thread() {
            @Override
            public void run() {
                final List<File> list = new ArrayList<>();
                if (file.isDirectory()) {//文件夹
                    File[] files = file.listFiles();
                    if (files != null) {
                        Arrays.sort(files);
                        Collections.addAll(list, files);
                    }
                }
                new Handler(Looper.getMainLooper()) {
                    @Override
                    public void handleMessage(Message msg) {
                        listener.onLoad(list);
                    }
                }.sendEmptyMessage(0);
            }
        }.start();
    }

    /**
     * 获取文件的最后修改时间
     *
     * @param file 文件
     * @return 修改时间
     */
    public static String getLastModifiedTime(File file) {
        String time = TimeUtil.getTime(file.lastModified());
        return time.substring(2);
    }

    /**
     * 判断SD卡是否存在
     *
     * @return 内存卡是否存在
     */
    public static boolean isSDCardExist() {
        return Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED);
    }

    /**
     * 获取SDCard卡路径
     *
     * @return SDCard路径
     */
    public static String getSDCardPath() {
        if (isSDCardExist())
            return Environment.getExternalStorageDirectory().toString();
        return null;
    }

    /**
     * 获取应用的根文件夹
     *
     * @param context 上下文
     * @param name    文件夹名称
     * @return path
     */
    public static String getSoftRootPath(Context context, String name) {
        if (isSDCardExist()) {
            String path = getSDCardPath() + File.separator + name;
            makeRootDirectory(path);//创建此文件夹
            return path;
        } else
            return context.getFilesDir().getPath();
    }


    /**
     * 获取Bitmap通过文件
     *
     * @param path 路径
     * @return 位图
     */
    public static Bitmap loadBitmap(String path) {
        if (!StringUtils.isEmpty(path)) {
            return BitmapFactory.decodeFile(path);
        }
        return null;
    }

    /**
     * 新建文件夹如果文件夹不存在
     *
     * @param filePath 路径
     */
    public static boolean makeRootDirectory(String filePath) {
        File file = new File(filePath);
        if (!file.exists()) {
            return file.mkdir();
        }
        return true;
    }

    /**
     * 获取文件的权限信息
     *
     * @param file 文件
     * @return 文件的权限信息
     */
    public static String getFileAuthority(File file) {
        try {
            Process process = Runtime.getRuntime().exec("ls -la " + file.getPath());
            BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream()));
            StringBuilder sb = new StringBuilder();
            String str;
            while ((str = br.readLine()) != null) {
                sb.append(str);
                sb.append('\n');
            }
            return sb.toString();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "--------";
    }

    public static String fileSize(long size) {
        DecimalFormat df = new DecimalFormat("0.00");
        if (size < Math.pow(2, 10)) {
            return size + "byte";
        } else if (size < Math.pow(2, 20)) {
            return df.format(size / Math.pow(2, 10)) + "KB";
        } else if (size < Math.pow(2, 30)) {
            return df.format(size / Math.pow(2, 20)) + "MB";
        } else if (size < Math.pow(2, 40)) {
            return df.format(size / Math.pow(2, 30)) + "GB";
        } else {
            return df.format(size / Math.pow(2, 40)) + "TB";
        }
    }

    /**
     * 获取文件的大小
     *
     * @param file 文件
     * @return 文件的大小
     */
    public static long getSize(File file) {
        if (file.isFile()) {
            return file.length();
        } else {
            return getFolderSize(file);
        }
    }


    /**
     * 获取文件夹的文件大小
     *
     * @param file 文件夹
     * @return file size
     */
    public static long getFolderSize(File file) {
        long size = 0;
        if (file.isFile())
            return -1;
        else {
            File[] files = file.listFiles();
            for (File f : files) {
                if (f.isFile())
                    size += f.length();
                else
                    size += getFolderSize(f);
            }
        }
        return size;
    }

    public static boolean delete(File file) {
        return file != null && (file.isFile() ? file.delete() : deleteFolder(file));
    }

    /**
     * 删除文件夹
     *
     * @param file 文件夹
     * @return 是否删除成功
     */
    private static boolean deleteFolder(File file) {
        boolean flag = false;
        if (file == null || file.isFile())
            return false;
        File[] files = file.listFiles();
        for (File f : files) {
            flag = f.isFile() ? f.delete() : deleteFolder(f);
            if (!flag)
                return false;
        }
        return flag && file.delete();
    }

    /**
     * 保存bitmap
     *
     * @param path   保存路径及名称
     * @param bitmap bitmap
     */
    public static void saveBitmap(String path, Bitmap bitmap) {
        if (bitmap != null) {
            File file = new File(path);
            makeRootDirectory(file.getParent());
            FileOutputStream fos;
            try {
                fos = new FileOutputStream(file);
                bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);
                fos.flush();
                fos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 系统的根目录
     *
     * @return 根目录的路径
     */
    public static String getRootPath() {
        return File.separator;
    }

    /**
     * 获取文件的类型
     *
     * @param file 文件
     * @return 类型
     */
    public static String getFileStyle(File file) {
        String fileName = file.getName();
        if (fileName.contains("."))
            return fileName.substring(fileName.lastIndexOf(".") + 1);
        return null;
    }

    /**
     * 按照读取文本方式来读文件
     *
     * @param file 文件
     * @return 文件的内容
     */
    public static String readFileAsText(File file) throws IOException {
        InputStream inputStream = new FileInputStream(file);
        return openAsText(inputStream);
    }

    /**
     * 以text文件形式打开
     *
     * @param open stream
     * @return str
     * @throws IOException
     */
    public static String openAsText(InputStream open) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(open));
        StringBuilder sb = new StringBuilder();
        String str;
        while ((str = reader.readLine()) != null) {
            sb.append(str).append('\n');
        }
        reader.close();
        open.close();
        return sb.toString();
    }
}